#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/11/27 20:10
# @Author  : lizhen
# @Site    : 
# @File    : cInput.py
# @Software: PyCharm
import msvcrt


class InputDemo:
    def _test_pwd_input(self, prompt=''):
        """
        id = InputDemo()
        print(id._test_pwd_input())
        """
        chars = []
        print(prompt)
        while True:
            try:
                new_char = msvcrt.getch().decode(encoding="utf-8")
            except Exception as e:
                return input("你很可能不是在cmd命令行下运行，密码输入将不能隐藏:")
            if new_char in '\r\n':  # 如果是换行，则输入结束
                break
            elif new_char == '\b':  # 如果是退格，则删除密码末尾一位并且删除一个星号
                if chars:
                    del chars[-1]
                    msvcrt.putch('\b'.encode(encoding='utf-8'))  # 光标回退一格
                    msvcrt.putch(' '.encode(encoding='utf-8'))  # 输出一个空格覆盖原来的星号
                    msvcrt.putch('\b'.encode(encoding='utf-8'))  # 光标回退一格准备接受新的输入
            else:
                chars.append(new_char)
                msvcrt.putch('*'.encode(encoding='utf-8'))  # 显示为星号
        return ''.join(chars)


if __name__ == '__main__':
    id = InputDemo()
    print(id._test_pwd_input())
